//
//  SLStoreController.m
//  Objective-C
//
//  Created by 陆承东 on 2018/11/9.
//  Copyright © 2018 S_Line. All rights reserved.
//

#import "SLStoreController.h"

#import "SLBMW.h"

//#import "NSObject+SLCategory.h"

@interface SLStoreController ()

@end

@implementation SLStoreController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self initData];
    
    [self UserDefaultsDemo];
    
    [self PropertyListDemo];
    
    [self KeyedArchiverDemo];
}

- (void)initData {
    /*
     * 沙盒目录梳理
     * Document: 适合存储重要数据，iTunesh会同步
     * Library/Caches: 适合存储体积大，不需要备份的非重要数据，iTunes不会同步
     * Library/Preference：通常保存应用的设置信息，iTunes会同步
     * tmp：保存应用运行时的零时文件，在应用关闭时，系统可能会清理此文件夹下的内容
     * SystemData：未知功能
     */
    
    // 获取程序的homel目录
    NSString *homePath = NSHomeDirectory();
    // 获取Document目录
    NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
    // 获取Cache目录
    NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, true).firstObject;
    // 获取Library目录
    NSString *libraryPath = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, true).firstObject;
    // 获取Library/Preferences
    NSString *preferencesPath = [libraryPath stringByAppendingString:@"/Preferences"];
    //获取tmp目录
    NSString *tmpPath = NSTemporaryDirectory();
    
    NSLog(@"\n----------> \nhomePath=%@ \ndocumentPath=%@ \ncachepath=%@ \nlibraryPath=%@ \npreferencesPath=%@ \ntmpPath=%@ \n---------->", homePath, documentPath, cachePath, libraryPath, preferencesPath, tmpPath);
}


#pragma mark ----- UserDefaults
- (void)UserDefaultsDemo {
    /*
     * NSUserDefaults 用于存储用户的偏好设置和用户信息
     * 数据保存在Library/Preference目录下
     * NSUserDefaults将输入的数据存储在.plist格式的文件下，
     * 这种存储方式就决定了它的安全性几乎为0，所以不建议存储一些敏感信息：如用户密码，token，加密私钥等
     * 它能存储的数据类型为NSNumber(NSInteger、float、double), NSString, NSDate, NSArray, NSDictionary, BOOL.
     * ❗️不支持存储自定义对象
     * ❗️存储的数据都是不可变的，想将可变数据存入需要先转为不可变数据
     * ❗️NSUserDefaults是定时把缓存中的数据写入磁盘的，而不是即时写入，为了防止在写完NSUserDefaults后程序退出导致的数据丢失，
     *   可以在写入数据后使用synchronize强制立即将数据写入磁盘。
     */
    
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setInteger:1 forKey:@"integer"];
    [userDefaults setBool:true forKey:@"bool"];
    [userDefaults setFloat:6.5 forKey:@"float"];
    [userDefaults setObject:@"123" forKey:@"object"];
    [userDefaults setObject:@[@1, @"123"] forKey:@"array"];
    BOOL success = [userDefaults synchronize];
    NSLog(@"success: %d - userDefaults: %@", success, userDefaults);
}

#pragma mark ----- Property List
- (void)PropertyListDemo {
    /*
     * 属性列表文件，全名是Property List，这种文件的扩展名为.plist。
     * ❗️不支持存储自定义对象
     */
    
    // 创建路径
    NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
    NSString *filePath = [documentPath stringByAppendingPathComponent:@"testPropertyList.plist"];
    
    // 写入数据
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    [dict setObject:@1 forKey:@"number"];
    [dict setObject:@"123" forKey:@"string"];
    [dict writeToFile:filePath atomically:true];
    
    // 读取
    NSMutableDictionary *readDict = [NSMutableDictionary dictionaryWithContentsOfFile:filePath];
    [readDict setObject:@[@1, @"abc"] forKey:@"array"];
    
    NSMutableDictionary *readDict1 = [NSMutableDictionary dictionaryWithContentsOfFile:filePath];
    NSLog(@"%@", readDict1);
}

#pragma mark ----- KeyedArchiver
- (void)KeyedArchiverDemo {
    /*
     * 归档时iOS开发中数据存储常用的技巧，归档可以直接将对象存储成文件，把文件读取成对象。
     * 相对于plist或者userdefault形式，归档可以存储的数据类型更加多想，并且可以存取自定义对象。
     * 对象归档的文件是保密的，在磁盘上无法查看文件中的内容，更加安全。
     * 归档的对象需要遵守NSCoding协议，并实现该协议中的两个方法。如果是继承，则子类一定要重写那两个方法。
     */
    
    SLBMW *bmwCar = [[SLBMW alloc] init];
    bmwCar.color = [UIColor blackColor];
    bmwCar.wheels = 4;
    bmwCar.createDate = [NSDate date];
    bmwCar.model = @"5系";
    
//    [SLBMW createKeyedArchiverCode];
    
    SLPerson *owner = [[SLPerson alloc] init];
    owner.age = 28;
    owner.height = @178;
    owner.weight = @60;
    owner.name = @"jack";
    bmwCar.owner = owner;
    
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true).firstObject stringByAppendingPathExtension:@"keyedArchiver.demo"];
    BOOL result = [NSKeyedArchiver archiveRootObject:bmwCar toFile:path];
    if (result == true) {
        SLBMW *bmwCar1= [NSKeyedUnarchiver unarchiveObjectWithFile:path];
        NSLog(@"%@", bmwCar1);
    }
}

@end
